import Peer from "peerjs";
import type {SignalMessage} from "./call.ts";
import {Callee, Caller, CallStatus} from "./call.ts";

import {ref} from "vue";

/*
signal服务 逻辑：
1、用户登录成功后，连接signal ws服务。
2、监听 电话来电，当来电后弹出 通话来电页面。
3、当用户退出登录时，关闭signal ws服务。

通话逻辑：
caller呼叫方：
    1、主动呼叫callee：需要参数userId（自己uid）、peerId（对方uid）。
    2、等待 callee的响应信号：
        - 收到 拒接信号时：
        - 收到 接听信号时：
    3、结束通话：主动结束通话 or 对方发来结束通话信号。
    4、通话面板UI。

    呼叫流程：
        1. 点击呼叫按钮
        -> 2. 创建和对方的连接: peer.connect(this.calleeId)， 监听data，等待对方的回应
        -> 3.
callee接收方：
    1、callee接收到信号，并回应动作：拒接or接听。
        - 点击拒接时：结束；
        - 点击接听时：切换通话面板，开始通话；
    2、通话面板UI。
 */

let callee = ref(null); //接听者

class SignalWS {
    ip: string;
    port: number;
    userId: string;
    peer: any;

    constructor(signalHost: string) {
        console.debug("load signal ws ...")
        //创建peer
        const [ip, port] = signalHost.split(':');
        this.ip = ip;
        this.port = Number(port);
    }

    /**
     * 连接 peer ws
     * @param userId
     */
    connect(userId: string) {
        if (!userId) {
            throw new Error("userId为空，无法连接signalWS peer.");
        }
        this.userId = userId;

        if (this.peer) {
            return;
        }

        this.peer = new Peer(userId, {
            config: undefined,
            host: this.ip,
            port: Number(this.port),
            secure: false
        });

        this.peer.on('open', (id) => {
            console.log("[peer] open ... ", id)
        });

        //发送错误时回调
        this.peer.on('error', (err) => {
            console.log("[peer] err ... err =", err);
        });

        //断开连接事件回调：与 Peer服务器的 WebSocket 连接断开
        this.peer.on('disconnected', (e) => {
            console.log("[peer] websocket 已断开 ... e = ", e)
            console.log("尝试重连 peer ...")
            this.peer.reconnect();
        });

        //手动调用peer.disconnected()时，会触发‘close’事件。
        //peer.disconnect()和new Peer()是一对
        this.peer.on('close', (e) => {
            console.log("[peer] close ... e = ", e);
        });

    }

    //监听 电话来电
    bindListener(callState: any, signalHandle: any) {
        console.log("bindListener ... 监听电话来电")
        //连接事件回调：有人连接我时的回调
        this.peer.on('connection', (dataConn) => {
            console.log("[peer] connection ... ")
            if (callState.status == CallStatus.Talking) {
                console.warn("正在占线中.");
                callState.isRing = false;
                return;
            }

            dataConn.on('data', (msg) => {
                console.log('Received: ' + JSON.stringify(msg));
                signalHandle((msg as SignalMessage).command, (msg as SignalMessage).extend);
            });

            callee.value = new Callee(this.userId, dataConn); //我是接听者

            callState.isRing = true; //已经接收到电话
            console.log("isRing ... " + callState.isRing);
        });
    }

    bindCallMeCallback(callMeHandle: any) {
        this.peer?.on('call', callMeHandle);
    }

    createCaller(userId: string, calleeId: string, isGroup: boolean) {
        return new Caller(userId, calleeId, this.peer);
    }

    /**
     * 关闭 peer ws
     */
    disconnect() {
        this.peer?.disconnect();
        this.peer = null;
    }

}


const getCalleeRef = () => callee
export {
    SignalWS,
    getCalleeRef,
}
